; > Super1
;all code after this point remains in ROM to save RAM space
;write cycle triggers ROM address swap
 [ VIDC=1
VIDCTAB & &0
 & &400000F
 & &80000F0
 & &C0000FF
 & &10000F00
 & &14000F0F
 & &18000FF0
 & &1C000FFF
 & &20000444
 & &24000008
 & &28000080
 & &2C000088
 & &30000800
 & &34000808
 & &38000880
 & &3C000888
 & &40000FFF
 & &44000000
 & &48000888
 & &4C00000F
 & &60000004
 & &64000004
 & &68000004
 & &6C000004
 & &70000004
 & &74000004
 & &78000004
 & &7C000004
 & &8062C000
 & &8408C000
 & &880E0000
 & &8C0D8000
 & &905D8000
 & &945E8000
 & &98258000
 & &9C32C000
 & &A07FC000
 & &A4004000
 & &A8070000
 & &AC074000
 & &B07F4000
 & &B47FC000
 & &B8320000
 & &BC35C000
 & &C0000104
 & &E00000AB
 & &FFFFFFFF
 ]
 [ A5002P=1
INITMEMC & &3600000
 & &3620000
 & &365FFFF
 & &3680000
 & 0
 ]
CONT MOV SPSVC,#DUMPER
 [ MEMC=1
 ADD SPSVC,SPSVC,#PHYSICAL
 ]
 STMIA SPSVC,{R0-R14}^
 STR R14,[SPSVC,#15*4]
 [ A5002P=1
 MOV R0,#ROM
 LDR R0,[R0,#MEMCIMAGE]
 ORR R0,R0,#MEMCADR
 STR R0,[R0]
 ADR R1,INITMEMC
INITMEMCLOOP LDR R0,[R1],#4
 TEQ R0,#0
 STRNE R0,[R0]
 BNE INITMEMCLOOP
 ]
 [ VIDC=1
 MOV R1,#VIDCADR
 ADR R2,VIDCTAB
VIDCLOAD LDR R0,[R2],#4
 CMN R0,#1
 STRNE R0,[R1]
 BNE VIDCLOAD
 ]
 [ IOC=1
 [ A5002P=0
 MOV R1,#IOCADR
 MOV R0,#0
 STR R0,[R1,#&18]
 STR R0,[R1,#&28]
 STR R0,[R1,#&34]
 STR R0,[R1,#&38]
 MVN R0,#0
 STR R0,[R1]
 |
 MOV R0,#0
 MOV R1,#IOCADR
 STRB R0,[R1,#6*4]
 [ ADEV=1
 MOV R0,#&20
 ]
 STRB R0,[R1,#&A*4]
 [ ADEV=1
 MOV R0,#&40
 ]
 STRB R0,[R1,#&E*4]
 ]
 ]
 [ MEMC=1
 [ A5002P=0
 MOV R0,#0
 MOV R1,#OSMD
 STR R0,[R1]
 ]
 [ M4SIZE=0
 MOV R0,#127 ;David's modified mapping
 MOV R1,#CAM
 ADD R1,R1,#1
INITMC ADD R2,R1,R0,LSL #13
 MOV R3,R0,LSL #1
 AND R3,R3,#127
 ORR R3,R3,R0,LSR #6
 EOR R2,R2,R3
 STR R2,[R2]
 SUBS R0,R0,#1
 BPL INITMC
 |
 MOV R0,#127
 MOV R1,#CAM
INITMC ADD R2,R1,R0,LSL #15
 MOV R3,R0,LSL #3
 AND R3,R3,#127
 TST R0,#&40
 ORREQ R3,R3,#2 ;David's modified mapping
 TST R0,#&20
 ORRNE R3,R3,#4
 TST R0,#&10
 ORRNE R3,R3,#1
 ADD R2,R2,R3
 STR R2,[R2]
 SUBS R0,R0,#1
 BPL INITMC
 ]
 ]
 MOV R0,#0 ;Copy code to start of virtual space even if MEMC is present --- DJS
 LDR R9,[R0,#CACHENAMES] ;remember some old state
 LDR R10,[R0,#RAMLIMIT]
 LDR R11,[R0,#MEMLIMIT]
 LDRB R12,[R0,#BUFFLAG]
 MOV R1,#ROM
COPYLOOP LDR R2,[R1],#4
 STR R2,[R0],#4
 TEQ R0,#&E00
 BNE COPYLOOP
 MOV SPSVC,#SVCSTK
 TEQP PC,#2
 MOV SPIRQ,#IRQSTK
 [ MEMC=1
 MOV R0,#PHYSICAL
 |
 MOV R0,#0
 ]
 LDR R1,[R0] ;remember 0's contents
 MOV R2,#&FF
 ORR R2,R2,#&FF0000 ;make &00ff00ff pattern
 MVN R3,R2
 ADD R4,R0,#&1000
SIZER0 LDR R5,[R4] ;remember location contents
 STR R2,[R4]
 LDR R6,[R4]
 TEQ R2,R6
 BNE SIZERX ;first pattern not matched
 LDR R6,[R0]
 TEQ R1,R6
 BNE SIZERX ;wrapped back to 0 location
 STR R3,[R4]
 LDR R6,[R4]
 TEQ R3,R6
 BNE SIZERX ;second pattern not matched
 LDR R6,[R0]
 TEQ R1,R6
 BNE SIZERX ;wrapped back to 0 location
 STR R5,[R4],#1024 ;put back contents and move up 1k
 B SIZER0
SIZERX STR R5,[R4] ;put back contents
 STR R1,[R0] ;put back zero contents
 [ MEMC=1
 SUB R4,R4,#PHYSICAL
 ]
 MOV R0,#0
 STR R4,[R0,#STRACC]
 SWI NEWLINE
 CMP R9,R10
 BNE DEFAULTSTART ;cache pointer must equal ramlimit
 CMP R11,R10
 BHI DEFAULTSTART ;memlimit <= ramlimit
 CMP R10,R4
 BHI DEFAULTSTART ;ramlimit <= freshly calculated limit
 TST R9,#3
 BNE DEFAULTSTART ;word aligned
 CMP R9,#&10000
 BCC DEFAULTSTART
 CMP R12,#1
 BHI DEFAULTSTART ;buffering=0 or 1
 SUBEQ R11,R10,#20*1024
 MOVNE R11,R10 ;ramlimit
 STRB R12,[R0,#BUFFLAG]
 STR R9,[R0,#CACHENAMES]
 SWI WRITES
 = "Soft start ",0
 B SOFTSTART
DEFAULTSTART MOV R10,R4 ;RAMLIMIT
 SUB R11,R4,#20*1024 ;MEMLIMIT
 MOV R12,#1 ;default buffering on
SOFTSTART SWI WRITES
 = "Acorn RISC Second Processor ",0
 MOV R8,R4,LSR #10
 ADR R0,CLIEXIT
 MOV R1,R11
 MOV R2,R10
 MOV R4,#0
 MOV R5,#0
 MOV R6,#0
 MOV R7,#0
 MOV R3,#&FE0
 STMIA R3!,{R4,R5,R6,R7} ;zero the FEx locations
 STMIA R3!,{R4,R5,R6,R7} ;zero the FFx locations
 MOV R3,R12
 SWI SETENV ;set amount of memory
 BL PRTNUM
 SWI WRITES
 = "K",10,13,10,13,0
 ADR R0,(RESET1-8)
 MOV R0,R0,LSR #2
 ORR R0,R0,#&EA000000
 MOV R1,#0
 STR R0,[R1]
 MOV R0,#BUFFER
 STRB R1,[R0,#ESCFLG]
 MVN R0,#0
 STR R0,[R1,#BRKLST]
;now put in error handler and escape handler
 BL DEFHAN
 BL DEFHN2
 TEQP PC,#3
 SWI WRITEI+0
 MOV TUBER,#TUBE
 BL TUBER2 ;get continuation status
 TEQP PC,#0
 CMP R0,#&80
; BEQ GOIT
 MOV R0,#253
 MOV R1,#0
 MOV R2,#255
 SWI BYTE
 CMP R1,#0
 BEQ GOSUPV
 MOV R0,#0
 STRB R0,[R0,#BUFFLAG]
 STR R0,[R0,#CACHENAMES]
 LDR R2,[R0,#STRACC]
 SUB R1,R2,#20*1024
 MOV R3,#1
 MOV R4,#0
 MOV R5,#0
 MOV R6,#0
 MOV R7,#0
 SWI SETENV
 SWI WRITEI+7
GOSUPV TEQP PC,#0
 BL DEFHAN
 BL DEFHN2
 B CLILOP
TABLE & 1000000*6*6 ;hundreds of hours
 & 100000*6*6 ;tens of hours
 & 10000*6*6 ;hours
 & 10000*6 ;tens of minutes
 & 1000*6 ;minutes
TABLET & 1000 ;tens of seconds
 & 100 ;seconds
 & 10 ;tenths of seconds
 & 1 ;hundredths of seconds
CLIEXIT TSTP PC,#0 ;on return from user, print time so far
 SWI GETENV
 MOV R1,#BUFFER
 MOV R0,#1
 SWI WORD
 LDR R8,[R1] ;get time
 LDR R7,[R2]
 SUBS R8,R8,R7 ;subtract start
 LDRB R0,[R1,#4]
 LDRB R2,[R2,#4]
 SBCS R0,R0,R2
 BCC GOSUPV
 BNE GOSUPV
 SWI WRITES
 = 10,13,"Finished after ",0
 ADR R9,TABLE
 MOV R6,#0 ;init lzb
 BL DIGIT
 BL DIGIT
 BL DIGIT
 TEQ R6,#0
 BEQ NOHOUR
 SWI WRITES
 = " hr, ",0
 ALIGN
NOHOUR BL DIGIT
 BL DIGIT
 TEQ R6,#0
 BEQ NOMIN
 SWI WRITES
 = " min, ",0
 ALIGN
NOMIN BL DIGIT
 MOV R6,#1 ;force 0s to be printed
 BL DIGIT
 SWI 256+"."
 BL DIGIT
 BL DIGIT
 SWI WRITES
 = " sec.",LF,CR,0
 B GOSUPV
;print digit derived from r8 and current TABLE entry
DIGIT MOV R0,#"0"
 LDR R7,[R9],#4
DIGIT1 SUBS R8,R8,R7
 ADDCS R0,R0,#1
 BCS DIGIT1
 ADD R8,R8,R7 ;(went too far)
 TEQ R0,#"0"
 MOVNE R6,#1 ;if not zero, zap lzb
 TEQEQ R6,#0 ;if a zero, test lzb
 SWINE WRITEC
 MOV PC,R14
;print R8 in decimal: uses r0,r5,r6,r7,r8,r9
PRTNUM MOV R5,R14
 ADR R9,TABLET
 MOV R6,#0 ;init lzb
 BL DIGIT
 BL DIGIT
 BL DIGIT
 MOV R6,#1
 BL DIGIT
 MOV PC,R5
WORDSP SWI WRITES
 = "    ",0
 ALIGN
;print R10: uses r0,r2
WORDHX MOV R2,#32-4
WORDLP MOV R0,R10,LSR R2
 AND R0,R0,#15
 CMP R0,#9
 ORRLS R0,R0,#"0"
 ADDHI R0,R0,#"A"-10
 SWI WRITEC
 SUBS R2,R2,#4
 BPL WORDLP
 MOV PC,R14
BTWRHX BNE WORDHX
BYTEHX MOV R2,#8-4
 B WORDLP
SCLIFL SWI WRITES
 = "Attempt to run program inside "
 [ RELEASE=0
 = "Brazil"
 |
 = "Executive's RAM"
 ]
 = 10,13,0
 ALIGN
CLILOP MOV R0,#&87
 SWI BYTE
 AND R5,R2,#7
 MOV R0,#&EC
 MOV R1,#16+4
 MOV R2,#&EB
 SWI BYTE ;clear spool and print capability and get status to r1
 CMP R5,#7
 BEQ CLIPT1
 BL PATOUT
 = &00,&00,&00,&2A,&7F,&AB,&0E,&38
 = &00,&03,&0E,&BA,&FF,&AA,&00,&00
 = &E0,&B0,&30,&BA,&FF,&BA,&30,&30
 = &00,&00,&00,&AA,&FF,&AA,&00,&00
 = &00,&00,&01,&80,&00,&00,&01,&00
 = &00,&30,&B6,&FC,&78,&FC,&B6,&30
 B CLIPT2
CLIPT1 SWI WRITES
 = 132,157,135,"A*",156,0
 ALIGN
CLIPT2 MOV R0,#3
 SWI BYTE ;reset output status
 MOV R0,#STRACC
 MOV R1,#238
 MOV R2,#" "
 MOV R3,#255
 SWI READLINE
 BCS ESCAPE
 MOV R1,#BUFFER
 LDRB R2,[R1,#ESCFLG]
 TEQ R2,#0
 BNE ESCAPE
CLIA LDRB R1,[R0],#1
 TEQ R1,#" "
 TEQNE R1,#"*"
 BEQ CLIA
 ADR R2,MYCMDS
 BIC R1,R1,#&20
CLI1 MOV R4,R0 ;remember start pointer
 LDRB R3,[R2],#1 ;get character out of list
 TEQ R3,#1 ;end of list
 BEQ CLIS
 TEQ R3,R1
 BNE CLISKP
CLI2 LDRB R3,[R2],#1
 TEQ R3,#0
 BEQ CLIGOT
 LDRB R5,[R4],#1
 CMP R5,#"."
; BEQ CLIGTD
 BICNE R5,R5,#&20
 TEQ R5,R3
 BEQ CLI2
CLISKP LDRB R3,[R2],#1
 TEQ R3,#0
 BNE CLISKP
 ADD R2,R2,#7
 BIC R2,R2,#3
 B CLI1
CLIS SUB R0,R0,#1
 SWI CLI
 B CLILOP
;CLIGTD LDRB R3,[R2],#1
; TEQ R3,#0
; BNE CLIGTD
CLIGOT ADD R2,R2,#3
 BIC R2,R2,#3
 LDRB R5,[R4]
 CMP R5,#"@"
 BCS CLIS
 LDR PC,[R2]
MYCMDS = "BREAKCLR",0
 & BCLR+ROM
 = "BREAKLIST",0
 & BLST+ROM
 = "BREAKSET",0
 & BSET+ROM
 = "BUFF",0
 & BUFF+ROM
 = "CONTINUE",0
 & BCONT+ROM
 = "CACHE",0
 & CACHE+ROM
 = "H.",0
 & HELP+ROM
 = "HE.",0
 & HELP+ROM
 = "HEL.",0
 & HELP+ROM
 = "HELP",0
 & HELP+ROM
 = "INITSTORE",0
 & INITSTORE+ROM
 = "MEMORYI",0
 & DISASS+ROM
 = "MEMORYA",0
 & ALTER+ROM
 = "MEMORY",0
 & MEMORY+ROM
 = "NOBUFF",0
 & NOBUFF+ROM
 = "QUIT",0
 & QUIT+ROM
 = "SHOWREGS",0
 & SHOWREGS+ROM
 = "TRANSFER",0
 & TRANSFER+ROM
 = "UNCACHE",0
 & UNCACHE+ROM
 = 1
 ALIGN
HELP LDRB R5,[R4],#1
 TEQ R5,#" "
 BEQ HELP
 TEQ R5,#13
 BNE HELPS
 SWI WRITES
 [ RELEASE=0
 = "Brazil "
 ]
 = "Supervisor 1.00",10,13,"  Supervisor",10,13,0
 B CLIS
HELPS CMP R5,#"."
 BEQ HELPSU
 BIC R5,R5,#&20
 CMP R5,#"S"
 BNE CLIS
 BL HELPSUB
 CMP R5,#"U"
 BNE CLIS
 BL HELPSUB
 CMP R5,#"P"
 BNE CLIS
 BL HELPSUB
 CMP R5,#"E"
 BNE CLIS
 BL HELPSUB
 CMP R5,#"R"
 BNE CLIS
HELPSU SWI WRITES
 = "Supervisor resident commands (no abbreviations):",10,13
 = "BreakClr - [<address>] remove breakpoint from address, restoring old contents",10,13
 = "BreakList- gives list of currently set break points (max 10)",10,13
 = "BreakSet - <address> set breakpoint SWI at address, remembering old contents",10,13
 = "Buff     - turn on file buffering (default is on) - costs 20K RAM",10,13
 = "Cache    - <file> <lookup name> keeps program in high memory for speed",10,13
 = "Continue - start execution at last break point",10,13
 = "Go       - go to address; default &1000; text after ';' is environment string",10,13
 = "Gos      - call supervisor from some other program e.g. *gos from Basic",10,13
 = "Help     - reassuring message from Supervisor",10,13
 = "InitStore- <data> fills store with data; default: illegal instruction &EE000000",10,13
 = "Memory   - <address> [+][<address>] displayed in ARM words",10,13
 = "MemoryA  - [B] <address> [<new contents>] alter memory word/byte",10,13
 = "MemoryI  - <address> [+][<address>] displayed in ARM instructions",10,13
 = "NoBuff   - turns off file buffering",10,13
 = "Quit     - perform SWI EXIT",10,13
 = "ShowRegs - show the registers dumped on the traps",10,13
 = "Transfer - <file syst> <file syst> [<file> [<file>] or *] transfer file(s)",10,13
 = "UnCache  - [<lookup name>] remove all [specified] cached object",10,13
 = "   <address> in hex or a register name from r0-r15 or pc (8 subtracted)",10,13
 = 0
 B CLIS
HELPSUB LDRB R5,[R4],#1
 CMP R5,#"."
 BEQ HELPSU
 BIC R5,R5,#&20
 MOV PC,R14
BCLR BL SPACES
 BL RDINIT
 BL CHKEN2
 MOV R4,#BRKLST
 TEQ R8,#1
 BNE BCALL0
BCLR1 CMP R4,#STRACC
 BCS BCLRFL
 LDR R3,[R4],#8
 CMN R3,#1
 BEQ BCLRFL
 TEQ R3,R7
 BNE BCLR1
 LDR R2,[R4,#-4]
 STR R2,[R3]
 MVN R0,#1
 STR R0,[R4,#-8]
 B CLILOP
BCLRFL SWI WRITES
 = "There is no breakpoint there",10,13,0
 B CLILOP
BCALL0 SWI WRITES
 = "Clear all breakpoints? [Y/<anything>]",0
 SWI READC
 SWI NEWLINE
 TEQ R0,#"Y"
 TEQNE R0,#"y"
 BNE CLILOP
BCALL1 LDR R0,[R4],#4
 CMN R0,#1
 BEQ BCALL9
 CMN R0,#2
 LDR R1,[R4],#4
 STRNE R1,[R0]
 CMP R4,#STRACC
 BCC BCALL1
BCALL9 MOV R4,#BRKLST
 MVN R0,#0
 STR R0,[R4]
 SWI WRITES
 = "All breakpoints cleared",10,13,0
 B CLILOP
BLST BL CHKEND
 MOV R4,#BRKLST
BLSTA LDR R10,[R4],#8
 CMN R10,#1
 BEQ BLST1
 CMN R10,#2
 BEQ BLSTA
 SUB R4,R4,#8
 SWI WRITES
 = "Address,    Old Data",10,13,0
 ALIGN
BLST0 LDR R10,[R4],#4
 CMN R10,#1
 BEQ CLILOP
 BL WORDHX
 LDR R10,[R4],#4
 BL WORDSP
 SWI NEWLINE
 CMP R4,#STRACC
 BCS CLILOP
 B BLST0
BLST1 SWI WRITES
 = "No breakpoints set",10,13,0
 B CLILOP
BSET BL SPACES
 BL RDINIT
 BL CHKEN2
 MOV R4,#BRKLST
 TEQ R8,#1
 BNE BSETE1
BSET0 CMP R4,#STRACC
 BCS BSETFL
 LDR R3,[R4],#8
 TEQ R3,R7
 BEQ BSETE2
 CMN R3,#1
 BNE BSET0
 MOV R4,#BRKLST
BSET1 LDR R2,[R4],#8
 CMN R2,#2
 BEQ BSET4
 CMP R4,#STRACC
 BCS BSETFL
 CMN R2,#1
 BNE BSET1
 MVN R0,#0
 STR R0,[R4]
BSET4 BIC R7,R7,#3
 STR R7,[R4,#-8]
 LDR R0,[R7]
 STR R0,[R4,#-4]
 LDR R0,BVAR
 STR R0,[R7]
 B CLILOP
BVAR SWI BREAKPT
BSETE2 SWI WRITES
 = "Resetting breakpoint at same place",10,13,0
 B BSET4
BSETE1 SWI WRITES
 = "Sorry, can't guess where you wanted a breakpoint",10,13,0
 B CLILOP
BSETFL SWI WRITES
 = "No room in table for another breakpoint",10,13,0
 B CLILOP
BCONT BL CHKEND
 MOV R4,#DUMPER
 LDR R7,[R4,#15*4]
 BIC R7,R7,#&FC000003
 LDR R2,[R7]
 LDR R3,BVAR
 CMP R2,R3
 LDMNEIA R4,{R0-R15}^
;now find the appropriate instruction in the table
 MOV R4,#BRKLST
BCONT0 CMP R4,#STRACC
 BCS BCONTF
 LDR R3,[R4],#8
 TEQ R3,R7
 BEQ BCONT1
 CMN R3,#1
 BNE BCONT0
 B CLILOP
BCONT1 SWI WRITES
 = "Breakpoint is over ",0
 LDR R10,[R4,#-4]
 BL WORDHX
 SWI WRITES
 = ": out of line execute ?",0
 SWI READC
 SWI NEWLINE
 BCS ESCAPE
 TEQ R0,#"Y"
 TEQNE R0,#"y"
 BNE CLILOP
 MOV R8,#STRACC
 MOV R9,#DUMPER
 LDMIA R9!,{R0-R7}
 STMIA R8!,{R0-R7}
 LDMIA R9!,{R0-R7}
 BIC R11,R7,#&FC000003
 AND R7,R7,#&FC000003
 ORR R7,R7,#STRACC+128
 STMIA R8!,{R0-R7}
 MOV R9,#STRACC+128
 STR R10,[R9]
 ADD R11,R11,#4
 STR R11,[R9,#8]
 LDR R8,BCONTI
 STR R8,[R9,#4]
 MOV R8,#STRACC
 LDMIA R8,{R0-R15}^
BCONTI LDR PC,BCONTF
BCONTF SWI WRITES
 = "Can't find breakpoint in my table",10,13,0
 B CLILOP
SHOWREGS BL REGDUMP
 B CLILOP
BUFF BL CHKEND
 MOV R0,#0
 MOV R1,#0
 MOV R2,#0
 MOV R3,#0
 MOV R4,#0
 MOV R5,#0
 MOV R6,#0
 MOV R7,#0
 SWI SETENV
 MOV R0,#0
 SUB R1,R2,#4096+16*1024
 MOV R3,#1
 SWI SETENV
 SWI WRITES
 = "Buffering enabled, memory limit set to &",0
 SUB R10,R2,#4096+16*1024
 BL WORDHX
 SWI NEWLINE
 B CLILOP
NOBUFF BL CHKEND
 MOV R0,#0
 MOV R1,#0
 MOV R2,#0
 MOV R3,#0
 MOV R4,#0
 MOV R5,#0
 MOV R6,#0
 MOV R7,#0
 SWI SETENV
 MOV R0,#0
 MOV R1,R2
 MOV R3,#0
 SWI SETENV
 SWI WRITES
 = "Buffering disabled, memory limit set to &",0
 MOV R10,R2
 BL WORDHX
 SWI NEWLINE
 B CLILOP
ALTER BL SPACES
 TEQ R5,#"B"
 TEQNE R5,#"b"
 MOVEQ R11,#0
 MOVNE R11,#3
 BLEQ SPACES
 BL RDINIT
 TEQ R8,#1
 BNE CLIS
 BIC R9,R7,R11
 TEQ R5,#" "
 BLEQ SPACES
 BL RDINIT
 TEQ R8,#1
 BNE ALTERM
 TEQ R11,#0
 BEQ ALTERB
 [ MEMC=1
 SWI ENTERSWI
 ]
 LDR R4,[R9]
 STR R7,[R9]
 [ MEMC=1
 TEQP PC,#0
 ]
 SWI WRITES
 = "Word at ",0
 MOV R10,R9
 BL WORDHX
 SWI WRITES
 = " was ",0
 MOV R10,R4
 BL WORDHX
 SWI WRITES
 = " altered to ",0
 [ MEMC=1
 SWI ENTERSWI
 ]
 LDR R10,[R9]
 TEQP PC,#0
 BL WORDHX
 SWI NEWLINE
 B CLILOP
ALTERB LDRB R4,[R9]
 STRB R7,[R9]
 SWI WRITES
 = "Byte at ",0
 MOV R10,R9
 BL WORDHX
 SWI WRITES
 = " was ",0
 MOV R10,R4
 BL BYTEHX
 SWI WRITES
 = " altered to ",0
 LDR R10,[R9]
 BL BYTEHX
 SWI NEWLINE
 B CLILOP
ALTERM MOV R10,R9
 BL WORDHX
 SWI WRITES
 = " : ",0
 TEQ R11,#0
 LDREQB R10,[R9]
 LDRNE R10,[R9]
 BL BTWRHX
 SWI WRITES
 = "; ",0
 MOV R0,#STRACC
 MOV R1,#238
 MOV R2,#" "
 MOV R3,#255
 SWI READLINE
 BCS ESCAPE
 MOV R4,#STRACC
 BL SPACES
 TEQ R5,#13
 ADDEQ R9,R9,#1
 ADDEQ R9,R9,R11
 BEQ ALTERM
 TEQ R5,#"-"
 SUBEQ R9,R9,#1
 SUBEQ R9,R9,R11
 BEQ ALTERM
 BL RDINIT
 TEQ R8,#1
 BNE CLILOP
 TEQ R11,#0
 STREQB R7,[R9]
 STRNE R7,[R9]
 LDREQB R10,[R9],#1
 LDRNE R10,[R9],#4
 SWI WRITES
 = "         . ",0
 BL BTWRHX
 SWI NEWLINE
 B ALTERM
MEMORY BL SPACES
 BL RDINIT
 TEQ R8,#1
 BNE CLIS
 BIC R9,R7,#3
 TEQ R5,#" "
 BLEQ SPACES
 TEQ R5,#"+"
 BNE MEMI2
 BL SPACES
 BL RDINIT
 CMP R8,#1
 ADDEQ R7,R9,R7
 B MEMI3
MEMI2 BL RDINIT
 CMP R8,#1
MEMI3 ADDNE R7,R9,#256
 BL CHKEN2
 SWI WRITES
 = "Address  :     3 2 1 0     7 6 5 4     B A 9 8     F E D C :    ASCII Data"
 = 10,13,10,13,0
MEMP1 MOV R10,R9
 BL WORDHX
 SWI WRITES
 = " :",0
 [ MEMC=1
 SWI ENTERSWI
 LDR R10,[R9]
 TEQP PC,#0
 BL WORDSP
 SWI ENTERSWI
 LDR R10,[R9,#4]
 TEQP PC,#0
 BL WORDSP
 SWI ENTERSWI
 LDR R10,[R9,#8]
 TEQP PC,#0
 BL WORDSP
 SWI ENTERSWI
 LDR R10,[R9,#12]
 TEQP PC,#0
 BL WORDSP
 |
 LDR R10,[R9]
 BL WORDSP
 LDR R10,[R9,#4]
 BL WORDSP
 LDR R10,[R9,#8]
 BL WORDSP
 LDR R10,[R9,#12]
 BL WORDSP
 ]
 SWI WRITES
 = " : ",0
 MOV R2,#16
MEMP2
 [ MEMC=1
 SWI ENTERSWI
 ]
 LDRB R0,[R9],#1
 TEQ R0,#127
 CMPNE R0,#" "-1
 MOVLS R0,#"."
 SWI WRITEC
 SUBS R2,R2,#1
 BNE MEMP2
 SWI NEWLINE
 [ MEMC=1
 TEQP PC,#0
 ]
 CMP R9,R7
 BCC MEMP1
 B CLILOP
DestFS * &1000
SourceFS * &1100
DataBase * &1200
 ^ 0
CLIPointer # 4
OriginalFS # 1
ExecFileHandle # 1

CLIBuffer * &1300
XferBuffer * &1400

TRANSFER MOV R0,#0
 MOV R1,#0
 SWI ARGS
 MOV R3, #DataBase
 STRB R0, [R3, #OriginalFS]
 MOV R0, #&C6
 MOV R1, #0
 MOV R2, #0
 SWI BYTE ; exec file off
 STRB R1, [R3, #ExecFileHandle]
 MOV R0,#143
 BL SPACES
 TEQ R5,#13
 BEQ TRANSB
 MOV R6,#SourceFS
 BL MOVNAM
 BL SPACE2
 TEQ R5,#13
 BEQ TRANSB
 MOV R6,#DestFS
 BL MOVNAM
 BL SPACE2
 TEQ R5,#13
 BEQ TRANSI
 TEQ R5,#"*"
 BEQ TRANSA
 SUB R9,R4,#1
 MOV R10,R9
TRANA1 LDRB R5,[R4],#1
 CMP R5,#" "
 BHI TRANA1
 TEQ R5,#13
 MOVNE R10,R4
 BL MOVFIL
TRANSX BL GETORIGSTATE
 B CLILOP
GETORIGSTATE MOV R0,#0
 MOV R1,#0
 SWI ARGS
 MOV R3,#DataBase
 LDRB R4,[R3,#OriginalFS]
 TEQ R0,R4
 BEQ ResetExecFile
 MOV R0,#143
 MOV R1,#18
 MOV R2,R4
 SWI BYTE
ResetExecFile LDRB R1, [R3, #ExecFileHandle]
 MOV R0, #&C6
 MOV R2, #0
 SWI BYTE ; reset exec file
 MOV PC,R14
TRANSI SWI WRITES
 = "Filename to copy ",0
 BL GETORIGSTATE
 MOV R0,#STRACC
 MOV R1,#238
 MOV R2,#" "
 MOV R3,#255
 SWI READLINE
 BCS ESCAPE
 TEQ R1,#0
 BEQ TRANSX
 SWI WRITES
 = "New Name or RETURN ",0
 MOV R0,#STRACC+128
 MOV R1,#238
 SWI READLINE
 BCS ESCAPE
 MOV R0, #&C6
 MOV R1, #0
 MOV R2, #0
 SWI BYTE ; exec file off
 MOV R9,#STRACC
 ADD R10,R9,#128
 LDRB R0,[R10]
 CMP R0,#13
 MOVEQ R10,#STRACC
 BL MOVFIL
 B TRANSI
TRANSA BL SPACES
 TEQ R5,#13
 BNE TRANSB
 SWI WRITES
 = "Transfer all files from ",0
 MOV R0,#SourceFS
 SWI WRITE0
 SWI WRITES
 = " to ",0
 MOV R0,#DestFS
 SWI WRITE0
 SWI NEWLINE
 MOV R12,#0
TRNSA1 MOV R0,#SourceFS
 BL DoCLI
 MOV R0,#8
 MOV R1,#0
 MOV R2,#STRACC
 MOV R3,#1
 MOV R4,R12
 SWI MULTIPLE
 CMP R12,R4
 BCS TRANSX
 MOV R12,R4
 MOV R1,#STRACC
 LDRB R0,[R1],#1
 MOV R2,#0
 STRB R2,[R1,R0]
 MOV R0,#5
 SWI FILE
 CMP R0,#1
 BCC TRNSA1
 BHI TRNSA2
 MOV R9,R1
 MOV R10,R1
 BL MOVFIL
 B TRNSA1
TRNSA2 MOV R0,R1
 SWI WRITE0
 SWI WRITES
 = " is a directory",10,13
 B TRNSA1
TRANSB SWI WRITES
 = "Transfer syntax is <file system> <file system> followed by",10,13
 = "(a) <file name>                    moves with same name",10,13
 = "(b) <file name> <new file name>    moves with new name",10,13
 = "(c) *                              moves all files in directory",10,13
 = "(d)                                interactive file names",10,13,0
 B TRANSX
;move (r9) from (SourceFS) to (DestFS) as (r10)
MOVFIL MOV R0,#SourceFS
 MOV R13,R14
 BL DoCLI
 MOV R0,#&FF
 MOV R1,R9
 MOV R2,#XferBuffer
 MOV R3,#0
 SWI FILE
 MOV R8,R2
 MOV R5,R3
 MOV R0,#DestFS
 BL DoCLI
 MOV R0,#0
 MOV R1,R10
 MOV R2,R8
 MOV R3,R5
 ADD R5,R4,#XferBuffer
 MOV R8,R4
 MOV R4,#XferBuffer
 SWI FILE
 SWI WRITES
 = "File ",0
 ALIGN
 MOV R4,R9
MOVFL1 LDRB R0,[R4],#1
 CMP R0,#" "
 SWIHI WRITEC
 BHI MOVFL1
 SWI WRITES
 = " copied from ",0
 MOV R0,#SourceFS
 SWI WRITE0
 SWI WRITES
 = " to ",0
 MOV R0,#DestFS
 SWI WRITE0
 TEQ R9,R10
 BEQ MOVFL4
 SWI WRITES
 = " as ",0
 ALIGN
MOVFL3 LDRB R0,[R10],#1
 CMP R0,#" "
 SWIHI WRITEC
 BHI MOVFL3
MOVFL4 SWI WRITES
 = ", ",0
 CMP R8,#8192
 BCC MOVFL2
 MOV R8,R8,LSR #10
 BL PRTNUM
 SWI WRITES
 = "K bytes",10,13,0
 MOV PC,R13
MOVFL2 BL PRTNUM
 SWI WRITES
 = " bytes",10,13,0
 MOV PC,R13
DoCLI
; execute the sequence of commands pointed to by R0,
; with ` as a command separator.
; R1 - R4 are available as workspace
 MOV R1, #CLIBuffer
DoCLI_Copy_Loop
 LDRB R2, [R0], #+1
 STRB R2, [R1], #+1
 CMP R2, #0
 CMPNE R2, #143
 CMPNE R2, #"`"
 BNE DoCLI_Copy_Loop
 MOV R3, #0
 STRB R3, [R1, #-1]
 MOV R3, #DataBase
 STR R0, [R3, #CLIPointer]
 MOV R0, #CLIBuffer
 SWI CLI
 LDR R0, [R3, #CLIPointer]
 CMP R2, #0
 CMPNE R2, #143
 BNE DoCLI
 MOV PC, R14
INITSTORE BL SPACES
 BL RDINIT
 BL CHKEN2
 SWI GETENV
 MOV R0,R7
 TEQ R8,#1
 MOVNE R0,#&EE000000
 MOV R2,#&1000
 ADR R8,INITS1
 LDMIA R8,{R4,R5,R6,R7}
 MOV R8,#STRACC
 STMIA R8,{R4,R5,R6,R7}
 BL STRACC-ROM
 SWI WRITES
 = "Store initialised to &",0
 MOV R10,R0
 BL WORDHX
 SWI NEWLINE
 B CLILOP
INITS1 STR R0,[R2],#4
 TEQ R2,R1
 BNE INITS1
 MOV PC,R14
QUIT SWI EXIT
 LNK Super2
